package com.common.utils;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import static android.content.Context.TELEPHONY_SERVICE;


/**
 *
 * @类名: AndroidUniqueIdentifierUtil
 * @描述: Andriod唯一标识
 * @作者 cms
 * @创建日期 2017/3/1 8:49
 */

public class AndroidUniqueIdentifierUtil {

    private static class LazyHolder {
        private static final AndroidUniqueIdentifierUtil INSTANCE = new AndroidUniqueIdentifierUtil();
    }

    private AndroidUniqueIdentifierUtil() {

    }

    public static AndroidUniqueIdentifierUtil instance() {
        return LazyHolder.INSTANCE;
    }


    private String getIME(Context context) {
        TelephonyManager TelephonyMgr = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
        String deviceId = TelephonyMgr.getDeviceId();
        if (TextUtils.isEmpty(deviceId)) {
            deviceId = "";
        }
        return deviceId;
    }

    private String getPseudoUniqueID() {

        String pseudoUniqueId = "35" + //we make this look like a valid IMEI
                Build.BOARD.length() % 10 +
                Build.BRAND.length() % 10 +
                Build.CPU_ABI.length() % 10 +
                Build.DEVICE.length() % 10 +
                Build.DISPLAY.length() % 10 +
                Build.HOST.length() % 10 +
                Build.ID.length() % 10 +
                Build.MANUFACTURER.length() % 10 +
                Build.MODEL.length() % 10 +
                Build.PRODUCT.length() % 10 +
                Build.TAGS.length() % 10 +
                Build.TYPE.length() % 10 +
                Build.USER.length() % 10; //13 digits
        if (TextUtils.isEmpty(pseudoUniqueId)) {
            pseudoUniqueId = "";
        }
        return pseudoUniqueId;
    }

    private String getAndroidID(Context context) {
        String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        if (TextUtils.isEmpty(androidID)) {
            androidID = "";
        }
        return androidID;
    }

    private String getWLANMACAddress(Context context) {
        WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        String macAddress = wm.getConnectionInfo().getMacAddress();
        if (TextUtils.isEmpty(macAddress)) {
            macAddress = "";
        }
        return macAddress;
    }

    private String getBTMACAddress() {
        BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
        m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String address = m_BluetoothAdapter.getAddress();
        if (TextUtils.isEmpty(address)) {
            address = "";
        }
        return address;
    }

    public String getCombinedDeviceID(Context context) {
        String m_szLongID = getIME(context) + getPseudoUniqueID()
                + getAndroidID(context) + getWLANMACAddress(context) + getBTMACAddress();
        // compute md5
        MessageDigest m = null;
        try {
            m = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        m.update(m_szLongID.getBytes(), 0, m_szLongID.length());
        // get md5 bytes
        byte p_md5Data[] = m.digest();
        // create a hex string
        String m_szUniqueID = new String();
        for (int i = 0; i < p_md5Data.length; i++) {
            int b = (0xFF & p_md5Data[i]);
            // if it is a single digit, make sure it have 0 in front (proper padding)
            if (b <= 0xF)
                m_szUniqueID += "0";
            // add number to string
            m_szUniqueID += Integer.toHexString(b);
        }   // hex string to uppercase
        m_szUniqueID = m_szUniqueID.toUpperCase();
        return m_szUniqueID;
    }
}
